#pragma once

/// 顺序栈类型定义
template <typename E, int M>
struct SqStack
{
    E elem[M];
    int top;
};

/// 顺序栈的基本操作

/// 初始化栈为空 InitStack(&s)
template <typename E, int M>
void InitStack(SqStack<E, M> &s)
{
    s.top = 0;
}

/// 判断栈是否为空 StackEmpty(S)
template <typename E, int M>
bool StackEmpty(const SqStack<E, M> &s)
{
    return s.top == 0;
}

/// 插入栈 Push(&s,e)
template <typename E, int M>
void Push(SqStack<E, M> &s, E e)
{
    // 判断是否栈满
    if (s.top == M)
    {
        throw "stack full";
    }
    else
    {
        s.elem[s.top++] = e;
    }
}

/// 出栈 Pop
template <typename E, int M>
void Pop(SqStack<E, M> &s, E &e)
{
    // 判断栈是否为空
    if (s.top == 0)
    {
        throw "stack empty";
    }
    else
    {
        e = s.elem[--s.top];
    }
}



/// 取栈顶元素 GetTop(s,&e)
template <typename E, int M>
void GetTop(const SqStack<E, M> &s, E &e)
{
    // 判断栈是否为空
    if (s.top == 0)
    {
        throw "Stack empty";
    }
    else
    {
        e = s.elem[s.top - 1];
    }
}